<?php 
/**
 * 公共函数库
 * 
 * Created	  : 2010-10-12
 * Modified   : 2010-10-12
 * @author	  : Joseph Chen (Jsph.chen@gmail.com)
 */

/**
 * 自动加载类文件
 * @param string $class_name 
 */
function __autoload($class_name)
{
	global $G, $servicesPath;
	if (is_file($file = $G['path_class'].$class_name.'.class.php')) {
//		L(strtolower($class_name));// 同时载入对应类的语言包
		require $file;
	} elseif (is_file($file = $G['path_class'].'mo/'.$class_name.'.class.php')) {
		// 同时载入对应类的语言包
		L(strtolower($class_name));
		// 载入类声明文件并判断是否存在默认的配置文件并载入
		require $file;
		// 设置类的默认配置
		MCBase::init($class_name);
	} elseif (is_file($file = $servicesPath.$class_name.'.php')) {
		require $file;
	} else {
		global $L;
//		debug_print_backtrace();
		trigger_error(
			sprintf($L['LClassFileIsNotExists'], $class_name),
			E_USER_ERROR
		);
	}
	return true;
}
//缓存
$CACHE=0;
function getCache(){
	global $CACHE;
	if(!$CACHE){
		$CACHE= new MemcachedCache;
		//$CACHE = new FileCache();
	}
	return $CACHE;
}
$CACHE=getCache();

/**
 * 载入语言文件
 * @param $cfgName 配置文件名称
 */
function L()
{
	global $G, $L;
	$Ls = func_get_args();
	foreach ($Ls as $lang_name)
	{
		$lang_file = $G['path_lang'].'/'.$G['sys_lang'].'/'.$lang_name.'.lang.php';
		if (is_file($lang_file))
		{
			$tmp = include_once $lang_file;
			if (!is_array($tmp))
			{
				continue;
			}
			$L = $L+$tmp;
		}
	}
	return $L;
}

/**
 * Global Config
 * 载入一个/多个配置文件 ,并整合到全局配置数组中
 * @param $cfgName,.... 配置名
 */
function GC()
{
	global $G;
	$Cs = func_get_args();
	foreach ($Cs as $cfgName)
	{
		$cfgFile = $G['path_cfg'].'/'.$cfgName.'.cfg.php';
		if (is_file($cfgFile))
		{
			$tmp = include $cfgFile;
			if (!is_array($tmp))
			{
				continue;
			}
			$GLOBALS['G'] = $GLOBALS['G']+$tmp;
		}
	}
	return $GLOBALS['G'];
}

/**
 * Config
 * 载入一个/多个配置文件 ,并返回配置数据
 * @param $cfgName,.... 配置名
 */
function C()
{
	global $G;
	$Cs = func_get_args();
	$c = array();
	foreach ($Cs as $cfgName)
	{
		if (empty($cfgName)) {
			continue;
		}
		$cfgFile = $G['path_cfg'].$cfgName.'.cfg.php';
		if (is_file($cfgFile))
		{
			$tmp = include $cfgFile;
			if (!is_array($tmp))
			{
				continue;
			}
			$c = $c+$tmp;
		}
	}
	return $c;
}

function CI_ONCE()
{
	global $G;
	$Cs = func_get_args();
	foreach ($Cs as $cfgName)
	{
		if (empty($cfgName)) {
			continue;
		}
		$cfgFile = $G['path_cfg'].$cfgName.'.cfg.php';
		if (is_file($cfgFile))
		{
			include_once $cfgFile;
		}
	}
	return true;
}

/**
 * Update Config
 * 更新一个配置数据
 * @param string $cfgName 配置名
 * @param array $data 数据
 */
function UC($cfgName, $data)
{
	global $G;
	$cfgFile = $G['path_cfg'].'/'.$cfgName.'.cfg.php';
	writefile($cfgFile, 'return '.var_export($data,true), 'php');
	return true;
}

/**
 * Data
 * 载入一个/多个数据文件 ,并返回数据
 * @param $dataName,.... 数据名
 */
function D()
{
	global $G;
	$Ds = func_get_args();
	$d = array();
	foreach ($Ds as $dataName)
	{
		$dataFile = $G['path_data'].'inc/'.$dataName.'.data.php';
		if (is_file($dataFile))
		{
			$tmp = include $dataFile;
			if (!is_array($tmp))
			{
				continue;
			}
			$d = $d+$tmp;
		}
	}
	return $d;
}

/**
 * Update Data
 * 更新一个数据
 * @param string $dataName 数据名
 * @param array $data 数据
 */
function UD($dataName, $data)
{
	global $G;
	$dataFile = $G['path_data'].'inc/'.$dataName.'.data.php';
	writefile($dataFile, 'return '.var_export($data,true), 'php');
	return true;
}


/**
 * mkdir 的扩展,可以递归创建目录
 * @param $path 设置的目录
 * @param $mode 目录的模式
 * @return boolean
 */
function mkdirext($path, $mode=0775) {
    if (is_dir($path)) {
        return true;
    }
    $pathes = explode('/', $path);
    $path = '';
    foreach ($pathes as $tmp) {
        $path .= $tmp.'/';
        if (!is_dir($path)) {
            mkdir($path, $mode);
        }
    }
    return $path;
}

/**
 * 将数据写入文件
 * @param $file 文件名
 * @param $data 写入文件的数据
 * @param $filemod 文件类型：text|php
 * @param $openmod 打开文件的模式
 * @param $exit 写入错误是否退出程序
 * @return boolean
 */
function writefile($file, $data, $filemod='text', $openmod='w', $exit=1) {
    mkdirext(dirname($file));
    if(!$fp = fopen($file, $openmod)) {
        if($exit) {
            exit('File :<br>'.path_format($file).'<br>Have no access to write!');
        } else {
            return false;
        }
    } else {
        if($filemod == 'php') {
            $data = "<?php\n".$data.';';
        }
        flock($fp, 2);
        fwrite($fp, $data);
        fclose($fp);
        return true;
    }
}

/**
 * 分割一个字符串到数组中
 * @param string $str 要分割的字符串
 * @param string $delimiter 分隔符
 */
function splitstr($str, $delimiter=',')
{
	if (empty($str)) {
		return array();
	} else {
		return explode($delimiter, $str);
	}
}

/**
 * 将简单数组转化成二维数组
 * @param $arr
 * @param $keyField 数组键转化成的字段名
 * @param $valField 数组值转化成的字段名
 */
function arr2dimension($arr, $keyField='key', $valField='title')
{
	$return = array();
	foreach ($arr as $key=>$val) {
		$return[] = array(
			$keyField => $key,
			$valField => $val
		);
	}
	return $return;
}

function array2simple($arr, $idField='id', $nameField='name')
	{
		$tmp = array();
		if (!is_array($arr))
		{
			return array();
		}
		foreach ($arr as $item)
		{
			$key = $item[$idField];
			$tmp[$key] = $item[$nameField];
		}
		return $tmp;
	}


/****************************************
 * 游戏逻辑
 ****************************************/

/**
 * 判断变量是否整型或整型字符串
 * @param int | string $s
 * @return Boolean
 */
function is_int_string($s) {
	return (is_numeric($s) && strpos($s,".")===false);
}

/**
 * 配置的Key为区间最大值时,反应指定值范围内对应配置
 * @param int $key 
 * @param array $haystack 查找的数组
 * @param array $type 查找的模式 大于区间的值还是小于区间的值
 */
function getRangeKeyValue($key, $haystack, $type='lt')
{
	if ($type == 'lt') {
		ksort($haystack);
	} else {
		krsort($haystack);
	}
	foreach ($haystack as $k=>$v) {
		if ($type == 'lt' && $key <= $k) {
			return $v;
		} else if ($type == 'gt' && $key >= $k) {
			return $v;
		}
	};
}


/**
 * 根据配置生成最终产品的数值
 * @param int $output
 * @param int $max_output
 * @param int $outputCfg
 */
function getOutput($output, $max_output, $outputCfg)
{
	$outputCfg = C('output/'.$outputCfg);
	$cnt = count($outputCfg);
	$interval = floor($max_output/$cnt);
	$offset = floor($output/$interval-1);
	
	$cropNum = $outputCfg[$offset];
	return $cropNum;
}
	
/**
 * 生成产量数值配置
 * @param int $max 最大循环数
 * @param int $seed 最大产出个数
 * @param float $rate 
 */
function generateOutputCfg($max, $seed, $rate, $cfgName='crop_output')
{
	$sizes = array('L', 'M', 'S');
	$sizeNums = count($sizes);
	$arr = array();
	
	$start = floor($seed*$rate)+1;
	for ($i=$start; $i<=$max; $i++) {
		$numStr = sprintf('%03s', $i);
		$numArr = array();
		$strlen = strlen($numStr);
		$numSum = 0;
		for($j=0; $j<$strlen; $j++) {
			$numArr[] = $numStr[$j];
			$numSum += $numStr[$j];
		}
	
		foreach ($sizes as $k=>$v) {
			$numArr[$v] = $numArr[$k];
			unset($numArr[$k]);
		}
		if ($i<=9) {
			$arr[] = $numArr;
		} elseif ($numSum==9) {
			$arr[] = $numArr;
		} else {
			
		}
	}
	
	UC($cfgName, $arr);
	
	return $arr;
}

/**
 * 根据机率定义列表返回最终随机结果
 * @param $rand_list 机率定义列表
 * @param $base 机率基础百分比
 * @param $lessen 机率减少值
 * @return 返回定义列表的KEY值，如果为false则随机结果为失败
 */
function getRandResult($rand_list, $base=100, $lessen=0)
{
    $rnd = rand(1, $base*100);
    if (is_int_string($rand_list) || is_float($rand_list)) {
        return $rnd < $rand_list*$base;
    }
    $val = 0;
    foreach ($rand_list as $k => $v) {
    	$val += $v*100;
    	if ($lessen > 0) {
    		$val = $val * (100 - $lessen) / 100;
    	}
    	if ($rnd <= $val) {
    		return $k;
    	}
    }
    return false;
}

/**
 * 是否敏感词
 * @param string $str 机率定义列表
 */
function isIncFileterKw($str)
{
	$filter = C('filter');
	foreach ($filter as $v) {
		if (false !== mb_strpos($str, $v)) {
			return true;
		}
	}
	return false;
}

/**
 * 过滤敏感词
 * @param string $str 机率定义列表
 */
function incFileterKw($str)
{
	$filter = C('filter');
	foreach ($filter as $v) {
		if (false !== mb_strpos($str, $v)) {
			$replace = array(
				$v => str_repeat('*', mb_strlen($v))
			);
			$str = strtr($str, $replace);
		}
	}
	return $str;
}

/**
 * 表情 
 */
function toFace($msg){
	global $G;
	///\#[0-82]/
	
	$faceCodeAry = array();
	for($i=$G['max_face_num']; $i>0; $i--){
		$faceCodeAry[$i] = '/#'.$i.'/';
	}
	
	$faceAry     = array();
	for($i=$G['max_face_num']; $i>0; $i--){
		$faceAry[$i] = '<img src="'.$G['url_img'].'face/'.$i.'.gif" />';
	}	
			
	return preg_replace($faceCodeAry,$faceAry,$msg);
} 

